Spring Boot JPA এবং Caching
Spring Boot JPA ডেটাবেস অপারেশন এবং ডেটা স্টোরেজ সিস্টেমের সাথে কাজ করার সময় ডেটার caching একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। Caching ব্যবহারের মাধ্যমে, আপনি ডেটাবেসে কম রিকোয়েস্ট পাঠাতে পারেন এবং অ্যাপ্লিকেশন পারফরম্যান্স বৃদ্ধি করতে পারেন। Caching এর মাধ্যমে একবার ফেচ করা ডেটা পরবর্তী রিকোয়েস্টে দ্রুত পাওয়া যায়, যা পারফরম্যান্সের উন্নতি ঘটায়।
Spring Framework ডেটাবেসের জন্য second-level caching সমর্থন করে, যেখানে Spring Data JPA ব্যবহার করে Hibernate এর second-level cache ব্যবহৃত হয়। এর মাধ্যমে JPA ক্যাশিং সরাসরি ডেটাবেসের সাথে সংযুক্ত থাকে না, তবে Hibernate-এর সাথে একত্রে কাজ করে।
1. Spring Boot Caching কনফিগারেশন
Spring Boot অ্যাপ্লিকেশনে caching কনফিগার করার জন্য আপনাকে কিছু গুরুত্বপূর্ণ স্টেপ অনুসরণ করতে হবে:
1.1. Spring Boot Caching এর জন্য Dependency যোগ করা
Spring Boot Caching ব্যবহার করার জন্য প্রথমে আপনার pom.xml ফাইলে Spring Cache এবং JPA এর জন্য নির্ভরশীলতা যোগ করতে হবে।
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
</dependencies>
এখানে, spring-boot-starter-cache এবং hibernate-ehcache এর সাহায্যে ক্যাশিং সক্রিয় করা হবে। EhCache হোস্টিং ক্যাশিং ফ্রেমওয়ার্ক হিসেবে ব্যবহৃত হবে।
1.2. Application Properties কনফিগারেশন
Spring Boot অ্যাপ্লিকেশনে EhCache ব্যবহার করতে হলে, application.properties বা application.yml ফাইলে কিছু কনফিগারেশন সেট করতে হবে।
application.properties ফাইল:
spring.cache.type=ehcache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
এখানে, spring.cache.type=ehcache সেট করে EhCache কে ক্যাশিং সিস্টেম হিসেবে ব্যবহার করা হয়েছে এবং Hibernate এর second-level cache ব্যবহার করতে বলা হয়েছে।
2. Entity ক্যাশিং কনফিগারেশন
Spring Data JPA তে ক্যাশিং চালু করতে হলে, আপনি Hibernate Entity-এ @Cacheable অ্যানোটেশন ব্যবহার করতে পারেন। Hibernate Entity-এ ক্যাশিং কনফিগার করার মাধ্যমে, আপনি ডেটা ক্যাশে রাখার জন্য নির্দেশনা দিতে পারবেন।
উদাহরণ: User Entity তে ক্যাশিং কনফিগারেশন
package com.example.model;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Enable caching for this entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
এখানে, @Cache অ্যানোটেশন ব্যবহার করে User Entity তে READ_WRITE ক্যাশিং কৌশল ব্যবহৃত হয়েছে, যার মানে হলো ক্যাশে ডেটা পড়া এবং লেখা হবে।
3. Repository-এ ক্যাশিং কনফিগারেশন
Spring Data JPA Repository-এ @Cacheable অ্যানোটেশন ব্যবহার করে ক্যাশিং নির্ধারণ করা যায়। @Cacheable অ্যানোটেশনটি সাধারণত Method level ক্যাশিং কনফিগারেশনে ব্যবহৃত হয়।
উদাহরণ: UserRepository Repository তে ক্যাশিং কনফিগারেশন
package com.example.repository;
import com.example.model.User;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable(value = "users", key = "#name") // Cache the method result by name
User findByName(String name);
}
এখানে, @Cacheable অ্যানোটেশন ব্যবহার করা হয়েছে, যাতে findByName মেথডের আউটপুট ক্যাশে রাখা যায়। value হলো ক্যাশের নাম এবং key হলো ক্যাশের key যা এই মেথডের ইনপুট হিসেবে ব্যবহার করা হবে।
4. Service Layer-এ ক্যাশিং কনফিগারেশন
Spring Service Layer তেও ক্যাশিং কনফিগার করা যেতে পারে, যেখানে আপনি @CachePut, @CacheEvict এবং @Cacheable এর মতো অ্যানোটেশন ব্যবহার করতে পারেন।
উদাহরণ: Service Layer-এ ক্যাশিং কনফিগারেশন
package com.example.service;
import com.example.model.User;
import com.example.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
এখানে:
@Cacheable: ক্যাশে থেকে ডেটা ফেচ করে (যদি এটি ক্যাশে না থাকে, তাহলে ডেটাবেস থেকে ফেচ হবে)।@CachePut: মেথডের ফলাফল ক্যাশে আপডেট করে।@CacheEvict: ক্যাশ থেকে নির্দিষ্ট ডেটা অপসারণ করে।
5. Cache Manager কনফিগারেশন
Spring Boot তে CacheManager কনফিগারেশন ব্যবহার করে ক্যাশিং সিস্টেম কাস্টমাইজ করা যায়। এটি EhCache বা অন্য ক্যাশিং সিস্টেম ব্যবহার করতে পারে।
উদাহরণ: CacheManager কনফিগারেশন
package com.example.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.config.CacheConfiguration;
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager();
}
}
এখানে, CacheManager কনফিগার করা হয়েছে EhCache ক্যাশিং ব্যবহারের জন্য।
6. Testing Cache
Spring Boot JPA ক্যাশিং সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করার জন্য, আপনি ডেটা ফেচ করার পর লগ আউটপুট পরীক্ষা করতে পারেন। একবার ডেটা ক্যাশে চলে গেলে, পরবর্তী ফেচে ডেটাবেসের পরিবর্তে ক্যাশ থেকেই ডেটা আসবে।
সারাংশ
Spring Boot JPA তে Caching ব্যবহারের মাধ্যমে ডেটাবেসে কম রিকোয়েস্ট পাঠানো যায় এবং অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করা সম্ভব। @Cacheable, @CachePut, এবং @CacheEvict অ্যানোটেশনগুলি ব্যবহার করে আমরা ক্যাশিং কনফিগার করতে পারি। এছাড়াও, EhCache এবং CacheManager ব্যবহার করে কাস্টম ক্যাশিং কনফিগারেশন করা সম্ভব। JPA এর সাথে ক্যাশিং ব্যবহারের মাধ্যমে ডেটা ফেচ করার সময় second-level caching এবং query caching সহ ক্যাশিং কার্যকরভাবে ব্যবহার করা যায়, যা পারফরম্যান্স উন্নত করে।
Read more